


// 2~32 得到需要多少个位  可以唯一占用任意某个int数，然后一个int有32个位  计算需要多少个int ,然后再计算这多少个int占用多少空间就可以了
// 经计算 要 512M的array<int>  可存任意的int数,
// 则存任意 uint64_t的数 应该需要1024MB的array<int>
// 





// num == 1024 即检测的数字范围是0----1023
struct BitMaps {

    BitMaps(const int size = 32, const int num = 1024 ) {
    
        bit_.resize(num);
    }

    bool set(int para) {
        int idx = para / size;
        int bitIdx = para % size;
        bit_[idx] |= 1 << bitIdx;
        return 1;
    }

    bool find(int para) {
        int idx = para / size;
        int bitIdx = para % size;
        bool rlt = bit_[idx]   &  (1 << bitIdx);
        return rlt;
    }


    int size;
    vector<int> bit_;
};











// int 的bit位数为32位 
// vecotr[0]  存0 -31 这些数字是否出现过
// vecotr[1]  存32 -63 这些数字是否出现过
// 假如将32改为64 则int应该变为float ，并且要保证是在64位指令长度的计算机上
class BitMap
{
public:
    //位图的内存大小和数据范围有关
    BitMap(size_t range)
        :_bit(range / 32 + 1)
    {}

    void set(const size_t num)
    {
        //计算数组中的下标
        int idx = num / 32;
        //计算num在对应下标整数中的下标位置
        int bitIdx = num % 32;
        //将对应的比特位置1   这里是将1 左移多少位，比如将1左五位时    则 0000 0001  ---->  0001 0000   ,再执行或操作，则第五位被设置为1了
        _bit[idx] |= 1 << bitIdx;  
    }

    bool find(const size_t num)
    {
        int idx = num / 32;
        int bitIdx = num % 32;
        return (_bit[idx] >> bitIdx) & 1;
    }

    void reset(const size_t num)
    {
        int idx = num / 32;
        int bitIdx = num % 32;
        _bit[idx] &= ~(1 << bitIdx);
    }
private:
    vector<int> _bit;
};
